﻿using Kaskelot.Services.Model;
using System;
using System.Linq;

namespace Stockholm.SOA.Kaskelot.WCF.ServiceImplementation.Mapping
{
	public static class PersonKursTillfalleExtensions
	{
		public static DataContracts.PersonKursTillfalle ToContract(this PersonKursTillfalle entity)
		{
			DataContracts.PersonKursTillfalle b = new DataContracts.PersonKursTillfalle();

			CopyFromEntity(entity, b, false);

			return b;
		}

		public static DataContracts.PersonKursTillfalle ToMinimalContract(this PersonKursTillfalle entity)
		{
			DataContracts.PersonKursTillfalle b = new DataContracts.PersonKursTillfalle();

			CopyFromEntity(entity, b, true);

			return b;
		}

		public static PersonKursTillfalle ToEntity(this DataContracts.PersonKursTillfalle b)
		{
			PersonKursTillfalle entity = new PersonKursTillfalle();

			CopyToEntity(b, entity);

			return entity;
		}

		public static void UpdateEntity(this PersonKursTillfalle entity, DataContracts.PersonKursTillfalle pkt)
		{
			CopyToEntity(pkt, entity);
		}

		private static void CopyFromEntity(PersonKursTillfalle from, DataContracts.PersonKursTillfalle to, bool minimal)
		{
			to.Id = from.Id;
			to.ValId = from.ValId;

			to.Andrad = from.Andrad;
			to.AndradAv = from.AndradAv;
			to.Skapad = from.Skapad;
			to.SkapadAv = from.SkapadAv;

			to.KursTillfalleId = from.KursTillfalleId;
			to.PersonId = from.PersonId;
			to.PersonNamn = from.Person != null ? from.Person.Fornamn + " " + from.Person.Efternamn : String.Empty;
			to.PersonEpost = from.Person != null ? from.Person.Epost : String.Empty;
			to.PersonMobTelNr = from.Person != null ? from.Person.MobTelNr : string.Empty;

			string valdistrikt = String.Empty;
			string grupp = String.Empty;

			if (from.Person != null)
			{
				if (from.Person.BemanningValdistrikt.Count() > 0)
					valdistrikt = from.Person.BemanningValdistrikt.FirstOrDefault().Valdistrikt.ToMinimalContract().FullName;

				if (from.Person.BemanningGrupp.Count() > 1)
					grupp = String.Join(", ", from.Person.BemanningGrupp.Select(bg => bg.Grupp.Benamning));
				else if(from.Person.BemanningGrupp.Count() > 0)
					grupp = from.Person.BemanningGrupp.FirstOrDefault().Grupp.Benamning;
			}

			if (String.IsNullOrEmpty(valdistrikt))
				to.PersonUppdrag = grupp;
			else if (String.IsNullOrEmpty(grupp))
				to.PersonUppdrag = valdistrikt;
			else
				to.PersonUppdrag = String.Join(", ", valdistrikt, grupp);

			switch (from.Status)
			{
				case "Närvaro":
					to.Status = DataContracts.PersonKursTillfalle.StatusTyp.Narvaro;
					break;
				default:
					to.Status = DataContracts.PersonKursTillfalle.StatusTyp.Placerad;
					break;
			}
		}

		private static void CopyToEntity(DataContracts.PersonKursTillfalle from, PersonKursTillfalle to)
		{
			to.Id = from.Id;
			to.ValId = from.ValId;

			to.Andrad = from.Andrad;
			to.AndradAv = from.AndradAv;
			to.Skapad = from.Skapad;
			to.SkapadAv = from.SkapadAv;

			to.KursTillfalleId = from.KursTillfalleId;
			to.PersonId = from.PersonId;

			switch (from.Status)
			{
				case DataContracts.PersonKursTillfalle.StatusTyp.Narvaro:
					to.Status = "Närvaro";
					break;
				default:
					to.Status = "Placerad";
					break;
			}
		}
	}
}
